home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / Main.bin / PlainDatagramSocketImpl.java < prev    next >
Text File  |  1998-09-22  |  5KB  |  176 lines

  1. /*
  2.  * @(#)PlainDatagramSocketImpl.java    1.10 98/07/01
  3.  *
  4.  * Copyright 1995-1998 by Sun Microsystems, Inc.,
  5.  * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
  6.  * All rights reserved.
  7.  * 
  8.  * This software is the confidential and proprietary information
  9.  * of Sun Microsystems, Inc. ("Confidential Information").  You
  10.  * shall not disclose such Confidential Information and shall use
  11.  * it only in accordance with the terms of the license agreement
  12.  * you entered into with Sun.
  13.  */
  14.  
  15. package java.net;
  16.  
  17. import java.io.FileDescriptor;
  18. import java.io.IOException;
  19. import java.io.InterruptedIOException;
  20.  
  21. /**
  22.  * Concrete datagram and multicast socket implementation base class.
  23.  * Note: This is not a public class, so that applets cannot call
  24.  * into the implementation directly and hence cannot bypass the
  25.  * security checks present in the DatagramSocket and MulticastSocket 
  26.  * classes.
  27.  *
  28.  * @author Pavani Diwanji
  29.  */
  30.  
  31. class PlainDatagramSocketImpl extends DatagramSocketImpl
  32. {
  33.  
  34.     /* timeout value for receive() */
  35.     private int timeout = 0;
  36.  
  37.     /**
  38.      * Load net library into runtime.
  39.      */
  40.     static {
  41.     System.loadLibrary("net");
  42.     }
  43.  
  44.     /**
  45.      * Creates a datagram socket
  46.      */
  47.     protected synchronized void create() throws SocketException {
  48.     fd = new FileDescriptor();
  49.     datagramSocketCreate();
  50.     }
  51.  
  52.     /**
  53.      * Binds a datagram socket to a local port.
  54.      */
  55.     protected synchronized native void bind(int lport, InetAddress laddr) throws SocketException;
  56.  
  57.     /**
  58.      * Sends a datagram packet. The packet contains the data and the
  59.      * destination address to send the packet to.
  60.      * @param packet to be sent.
  61.      */
  62.     protected native void send(DatagramPacket p) throws IOException;
  63.  
  64.     /**
  65.      * Peek at the packet to see who it is from.
  66.      * @param return the address which the packet came from.
  67.      */
  68.     protected synchronized native int peek(InetAddress i) throws IOException;
  69.  
  70.     /**
  71.      * Receive the datagram packet.
  72.      * @param Packet Received.
  73.      */
  74.     protected synchronized native void receive(DatagramPacket p) throws IOException;
  75.  
  76.     /**
  77.      * Set the TTL (time-to-live) option.
  78.      * @param TTL to be set.
  79.      */
  80.     protected native void setTTL(byte ttl) throws IOException;
  81.  
  82.     /**
  83.      * Get the TTL (time-to-live) option.
  84.      */
  85.     protected native byte getTTL() throws IOException;
  86.  
  87.     /**
  88.      * Join the multicast group.
  89.      * @param multicast address to join.
  90.      */
  91.     protected native void join(InetAddress inetaddr) throws IOException;
  92.  
  93.     /**
  94.      * Leave the multicast group.
  95.      * @param multicast address to leave.
  96.      */
  97.     protected native void leave(InetAddress inetaddr) throws IOException;
  98.  
  99.     /**
  100.      * Close the socket.
  101.      */
  102.     protected void close() {
  103.     if (fd != null) {
  104.         datagramSocketClose();
  105.         fd = null;
  106.     }
  107.     }
  108.  
  109.     protected synchronized void finalize() {
  110.     close();
  111.     }
  112.  
  113.     /**
  114.      * set a value - since we only support (setting) binary options 
  115.      * here, o must be a Boolean
  116.      */
  117.  
  118.      public void setOption(int optID, Object o) throws SocketException {
  119.      switch (optID) {
  120.         /* check type safety b4 going native.  These should never
  121.          * fail, since only java.Socket* has access to 
  122.          * PlainSocketImpl.setOption().
  123.          */
  124.      case SO_TIMEOUT:
  125.          if (o == null || !(o instanceof Integer)) {
  126.          throw new SocketException("bad argument for SO_TIMEOUT");
  127.          }
  128.          int tmp = ((Integer) o).intValue();
  129.          if (tmp < 0) 
  130.          throw new IllegalArgumentException("timeout < 0");
  131.          timeout = tmp;
  132.          return;
  133.      case SO_BINDADDR:
  134.          throw new SocketException("Cannot re-bind Socket");
  135.      case SO_REUSEADDR:
  136.          if (o == null || !(o instanceof Integer)) {
  137.          throw new SocketException("bad argument for SO_REUSEADDR");
  138.          } 
  139.          break;
  140.      case IP_MULTICAST_IF: 
  141.          if (o == null || !(o instanceof InetAddress))
  142.          throw new SocketException("bad argument for IP_MULTICAST_IF");
  143.          break;
  144.      default:
  145.          throw new SocketException("invalid option: " + optID);
  146.      }
  147.      socketSetOption(optID, o);
  148.      }
  149.  
  150.     /*
  151.      * get option's state - set or not
  152.      */
  153.  
  154.     public Object getOption(int optID) throws SocketException {
  155.     if (optID == SO_TIMEOUT) {
  156.         return new Integer(timeout);
  157.     }
  158.     int ret = socketGetOption(optID);
  159.  
  160.     if (optID == SO_BINDADDR || optID == IP_MULTICAST_IF) {
  161.         InetAddress in = new InetAddress();
  162.         in.address = ret;
  163.         return in;
  164.     } else {
  165.         return null;
  166.     }
  167.     }
  168.     
  169.     private native void datagramSocketCreate() throws SocketException;
  170.     private native void datagramSocketClose();
  171.     private native void socketSetOption(int opt, Object val) throws SocketException;
  172.     private native int socketGetOption(int opt) throws SocketException;
  173.     
  174. }
  175.  
  176.